/*
 * TextBox.cpp
 *
 *  Created on: 14/10/2012
 *      Author: Administrador
 */

#include "Textbox.h"
#include <string>
#include "SDL/SDL_ttf.h"
#include "SDL/SDL.h"
#include <iostream>
using namespace std;

TextBox::TextBox(int x, int y, int w, int h) {

    this->marcado = false;

    this->caja.x = x;
    this->caja.y = y;
    this->caja.w = w;
    this->caja.h = h;

    this->fuente = TTF_OpenFont("C:/WINDOWS/Fonts/Cour.ttf", 13);
    SDL_Colour color = {0x00,0x00,0x00};
    this->color_texto = color;
    this->fondo = NULL;
}

void TextBox::setFondo(SDL_Surface* f){
	this->fondo = f;
}

//Dibuja el textbox sobre el fondo
bool TextBox::dibujar() {
	return SDL_FillRect(this->fondo, &this->caja, 0xFFFFFF);
}

//Dibuja el texto que se ingresa por teclado dentro del textbox
bool TextBox::dibujarTexto() {
    this->dibujar();
    string display = "";

    display = this->texto;

    SDL_Surface* mensaje = NULL;
    mensaje = TTF_RenderText_Solid(this->fuente, display.c_str(), this->color_texto);
    SDL_Rect tmp = this->caja;
    tmp.x += 2;
    tmp.y += 5;
    return SDL_BlitSurface(mensaje, NULL, this->fondo, &tmp);
}

bool TextBox::dibujarTextoVisible() {

	this->dibujar();
    string display = "";

    if(this->texto.length() <= 23){

    	display = this->texto;

    } else {

    	int inicio = texto.length() - 23;
    	int fin = texto.length() - 1;
    	display = this->texto.substr(inicio,fin);
    }

    SDL_Surface* mensaje = NULL;
    mensaje = TTF_RenderText_Solid(this->fuente, display.c_str(), this->color_texto);
    SDL_Rect tmp = this->caja;
    tmp.x += 5;
    tmp.y += 5;
    return SDL_BlitSurface(mensaje, NULL, this->fondo, &tmp);
}

bool TextBox::dibujarTextoVisiblePuerto() {

	this->dibujar();
    string display = "";

    if(this->texto.length() <= 5){

    	display = this->texto;

    } else {

    	int inicio = texto.length() - 5;
    	int fin = texto.length() - 1;
    	display = this->texto.substr(inicio,fin);
    }

    SDL_Surface* mensaje = NULL;
    mensaje = TTF_RenderText_Solid(this->fuente, display.c_str(), this->color_texto);
    SDL_Rect tmp = this->caja;
    tmp.x += 5;
    tmp.y += 5;
    return SDL_BlitSurface(mensaje, NULL, this->fondo, &tmp);
}
void TextBox::setTexto(string txt){
	this->texto = txt;
}

string TextBox::getTexto() {
    return this->texto;
}

//Maneja los eventos que se producen sobre el textBox.
void TextBox::escucharEventos(SDL_Event* evento) {

	if(evento->type == SDL_MOUSEBUTTONDOWN && evento->button.button == SDL_BUTTON_LEFT) {
        int x = evento->button.x;
        int y = evento->button.y;
        if(x < this->caja.w+this->caja.x && x > this->caja.x && y < this->caja.h+this->caja.y && y > this->caja.y) {
            this->marcado = true;
        } else {
            this->marcado = false;
        }
    }
    else if(evento->type == SDL_KEYDOWN && this->marcado) {
        char c = (char)evento->key.keysym.sym;
        if((c >= '0' && c <= '9') || (c== '.')) {
            		if (this->texto.length() < 6 ) {
                        this->texto += c;
        		}
        }
        if(evento->key.keysym.sym == SDLK_BACKSPACE) {
            this->texto = this->texto.substr(0,this->texto.length()-1);
        }
        this->dibujarTextoVisiblePuerto();
    }
}

void TextBox::escucharEventosParaHost(SDL_Event *evento)
{

	if(evento->type == SDL_MOUSEBUTTONDOWN && evento->button.button == SDL_BUTTON_LEFT) {
		int x = evento->button.x;
		int y = evento->button.y;
		if(x < this->caja.w+this->caja.x && x > this->caja.x && y < this->caja.h+this->caja.y && y > this->caja.y) {
			this->marcado = true;
		} else {
			this->marcado = false;
		}
	}
	else if(evento->type == SDL_KEYDOWN && this->marcado) {
		char c = (char)evento->key.keysym.sym;

		if(
				( c >= '0' && c <= '9' ) || ( c== '.' ) || (c == '/') || (c == '_')
				|| ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' )
		) {
			if (this->texto.length() < 255 ) {
				this->texto += c;
			}

		}

		if(evento->key.keysym.sym == SDLK_BACKSPACE) {
			this->texto = this->texto.substr(0,this->texto.length()-1);
		}

		this->dibujarTextoVisible();
	}
}
